#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include "StdTcp.h"
#include "StdThread.h"
#include "StdSqlite.h"
#include "DoubleLinkList.h"

#define true 1
#define false 0

struct Message
{
    int flag;
    char online;
    int filesize;
    char onlinename[1000];
    char fromName[20];
    char username[20];
    char password[20];
    char toName[20];
    char content[1024];
    char allname[1000];
    char groupname[100];
    char event[1024];
    char group[100];
    char grouplist[1024];
    char chat[1024];
    char filepath[100];
    char file[100];
    char filename[20];
    char filelist[1024];
};

typedef struct Message Msg;

pthread_mutex_t pthread;
pthread_cond_t cond;
static int choice = 0;
char Fromname[20] = {0};
char Toname[20] = {0};
char Group[20] = {0};

void *thread_handler(void *arg)
{
    Tcpc *c = (Tcpc *)arg;

    while (1)
    {

        Msg msg;
        TcpClientRecv(c, &msg, sizeof(msg));

        if (msg.flag == 14)
        {
            memset(Fromname, 0, sizeof(Fromname));
            memset(Toname, 0, sizeof(Toname));
            printf("%s向你发送了好友申请\n", msg.event);
            printf("是否同意?\n");
            printf("toname:%s", msg.username);
            strcpy(Fromname, msg.event);
            strcpy(Toname, msg.username);
            printf("同意按101,拒绝按102\n");
        }

        if (msg.flag == 100)
        {
            char *pch;
            pch = strtok(msg.onlinename, "*");
            // printf("pppp:\n");
            while (pch != NULL)
            {
                printf("%s\n", pch);
                pch = strtok(NULL, "*");
            }
        }

        if (msg.flag == 201)
        {
            char *pch1;
            pch1 = strtok(msg.allname, "*");

            while (pch1 != NULL)
            {
                printf("%s\n", pch1);
                pch1 = strtok(NULL, "*");
            }
        }
        if(msg.flag==650)
        {
            printf("你还没好友呢，快去加点家人们💪！\n");
        }
        if(msg.flag==651)
        {
            printf("好友没一个在线的快去呼叫他们👨‍❤️‍💋‍👨!\n");
        }
        if (msg.flag == 202)
        {
            printf("%s给你发来%s\n", msg.event, msg.content);
            printf("按50查看下一条\n");
        }
        if (msg.flag == 203)
        {
            printf("%s不是你的好友哦,请换个人发哦!\n", msg.toName);
        }
        if (msg.flag == 206)
        {
            printf("你的消息列表已经空空如也👀\n");
        }
        if (msg.flag == 41)
        {
            printf("你已成功删除%s\n", msg.toName);
        }
        if (msg.flag == 61)
        {
            printf("创建成功!!\n");
            printf("按62去选择你要邀请的好友:\n");
        }
        if (msg.flag == 68)
        {
            printf("你不在这个群!\n");
        }
        if (msg.flag == 66)
        {
            printf("您所在的群聊有：\n");
            char *pch2;
            pch2 = strtok(msg.group, "*");
            while (pch2 != NULL)
            {
                printf("%s\n", pch2);
                pch2 = strtok(NULL, "*");
            }
        }
        if (msg.flag == 69)
        {
            memset(Group, 0, sizeof(Group));
            strcpy(Group, msg.groupname);
            printf("你是否进入%s\n", msg.groupname);
            printf("进入按300,反悔按301\n");
        }
        if (msg.flag == 320)
        {
            printf("您所在的群聊成员有：\n");
            char *pch3;
            pch3 = strtok(msg.grouplist, "*");
            while (pch3 != NULL)
            {
                printf("%s\n", pch3);
                pch3 = strtok(NULL, "*");
            }
        }
        if (msg.flag == 401)
        {
            printf("%s: %s: %s\n", msg.event, msg.fromName, msg.content);
            printf("按99查看下一条\n");
        }
        if (msg.flag == 89)
        {
            printf("你已被禁言\n");
        }
        if (msg.flag == 411)
        {
            printf("抱歉你的权限不够哦🐏");
        }
        if (msg.flag == 421)
        {
            printf("你已成功拉%s进群\n", msg.toName);
        }
        if (msg.flag == 431)
        {
            printf("你已成功踢出%s\n", msg.toName);
        }
        if (msg.flag == 451)
        {
            char *pch5;
            printf("现在群里可下载的文件有：\n");
            pch5 = strtok(msg.filelist, "*");
            while (pch5 != NULL)
            {
                printf("%s\n", pch5);
                pch5 = strtok(NULL, "*");
            }
        }
        if (msg.flag == 452)
        {
            printf("群列表空空如也,快去上传群文件吧!\n");
        }
        if (msg.flag == 461)
        {
            FILE *fp=fopen(msg.filename,"w");
            fwrite(msg.file,msg.filesize,1,fp);
            fclose(fp);
            printf("文件已保存\n");
        }
        if (msg.flag == 71)
        {
            char *pch4;
            pch4 = strtok(msg.chat, "*");
            while (pch4 != NULL)
            {
                printf("%s\n", pch4);
                pch4 = strtok(NULL, "*");
            }
        }
    }
}

int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        printf("invaild numbers!\n");
        return -1;
    }

    Tcpc *c = InitTcpClient(argv[1], atoi(argv[2]));
    if (c == NULL)
    {
        printf("client point is NULL!\n");
        ClearTcpClient(c);
        return -1;
    }
    pthread_mutex_init(&pthread, NULL);
    pthread_cond_init(&cond, NULL);
    while (1)
    {

        printf("********************************************************************\n");
        printf("*                       欢迎来到绿泡泡🌍                             *\n");
        printf("********************************************************************\n");
        printf("*                       注册请按1                                   *\n");
        printf("*                       登录请按2                                    *\n");
        printf("********************************************************************\n");
        Msg msg;
        msg.flag = 1;

        char a = '0';
        scanf("%c", &a);
        while (getchar() != '\n')
            ;
        if (a == '1')
        {
            printf("please input your name:\n");
            scanf("%[^\n]", msg.username);
            while (getchar() != '\n')
                ;

            printf("please input your Password\n");
            scanf("%[^\n]", msg.password);
            while (getchar() != '\n')
                ;

            msg.online = 1;
            printf("%s %s\n", msg.username, msg.password);
            TcpClientSend(c, &msg, sizeof(Msg));
            TcpClientRecv(c, &msg, sizeof(Msg));
            if (msg.flag = 10)
            {
                printf("注册成功!");
                printf("确定你的账号:%s\n", msg.username);
                printf("确定你的密码:%s\n", msg.password);
                sleep(1);
            }
            else
            {
                printf("账号已存在请重新输入!");
            }
        }
        if (a == '2')
        {
            printf("please input your name:\n");
            scanf("%[^\n]", msg.username);
            while (getchar() != '\n')
                ;

            printf("please input your Password\n");
            scanf("%[^\n]", msg.password);
            while (getchar() != '\n')
                ;

            msg.flag = 2;
            printf("%s %s\n", msg.username, msg.password);
            TcpClientSend(c, &msg, sizeof(Msg));
            TcpClientRecv(c, &msg, sizeof(Msg));
            if (msg.flag == 12)
            {
                printf("登录成功!\n");
            }
            else
            {
                printf("登录失败，请重新输入\n");
                continue;
            }

            Thread *t = InitThread(thread_handler, c);

            while (1)
            {
                // system("clear");
                printf("*  1.查看全部好友👨‍👨‍👦‍👦  \n");
                printf("*  2.查看在线好友👨‍❤️‍👨  \n"); // 4
                printf("*  3.添加好友🙆‍♂️     \n");     // 3
                printf("*  4.发消息🧏‍♂️       \n");
                printf("*  5.退出🤔         \n"); // 5
                printf("*  6.删除好友 👨‍🦯     \n");
                printf("*  7.建群👭          \n");
                printf("*  8.查看消息列表👈   \n");
                printf("*  9.查看群列表 🙌    \n");
                printf("*  10.进入群聊💑       \n");
                printf("*  11.查看聊天记录🤚   \n");
                printf("*  请输入你的选择:     \n");
                scanf("%d", &choice);
                while (getchar() != '\n')
                    ;
                switch (choice)
                {
                case 1:
                    msg.flag = 200;
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 2:

                    msg.flag = 4;
                    TcpClientSend(c, &msg, sizeof(msg));

                    break;
                case 3:

                    msg.flag = 3;
                    printf("请输入你想要加的好友名字\n");
                    strcpy(msg.fromName, msg.username);

                    scanf("%s", msg.toName);
                    while (getchar() != '\n')
                        ;
                    TcpClientSend(c, &msg, sizeof(msg));

                    break;
                case 4:
                    msg.flag = 7;
                    printf("想给谁发消息啊？\n");
                    strcpy(msg.fromName, msg.username);
                    scanf("%s", msg.toName);
                    while (getchar() != '\n')
                        ;
                    printf("发送点啥呢？\n");
                    scanf("%s", msg.content);
                    while (getchar() != '\n')
                        ;
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 5:
                    msg.flag = 5;
                    TcpClientSend(c, &msg, sizeof(msg));
                    ClearTcpClient(c);
                    return 0;
                    break;
                case 6:
                    msg.flag = 40;
                    printf("请输入你想要删除的好友名字\n");
                    scanf("%s", msg.toName);
                    while (getchar() != '\n')
                        ;
                    TcpClientSend(c, &msg, sizeof(msg));

                    break;
                case 7:
                    msg.flag = 60;
                    printf("请输入你想创建的群名：\n");
                    scanf("%s", msg.groupname);
                    while (getchar() != '\n')
                        ;
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 8:
                    msg.flag = 20;

                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 9:
                    msg.flag = 64;
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 10:
                    msg.flag = 67;
                    printf("请输入你想加入的群名：\n");
                    scanf("%s", msg.groupname);
                    while (getchar() != '\n')
                        ;

                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 11:
                    msg.flag = 70;
                    printf("查看与谁的聊天记录:\n");
                    scanf("%s", msg.toName);
                    while (getchar() != '\n')
                        ;
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 50:
                    msg.flag = 51;
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 62:
                    msg.flag = 63;
                    printf("选择你想要拉的人\n");
                    scanf("%s", msg.toName);
                    while (getchar() != '\n')
                        ;
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 101:

                    msg.flag = 6;
                    strcpy(msg.fromName, Fromname);
                    strcpy(msg.toName, Toname);
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 102:
                    msg.flag = 7;
                    printf("你已拒绝他的好友申请!\n");
                    TcpClientSend(c, &msg, sizeof(msg));
                    break;
                case 300:
                    int exitflag = 0;
                    while (1)
                    {
                        if (exitflag == 1)
                            break;
                        printf("1.查看群成员\n");
                        printf("2.发信息\n");
                        printf("3.查看群消息\n");
                        printf("4.禁言(管理员和群主才可以哦!)\n");
                        printf("5.拉人进群\n");
                        printf("6.踢人出群(管理员和群主才可以哦!)\n");
                        printf("7.上传文件\n");
                        printf("8.查看群文件\n");
                        printf("9.退出群聊\n");
                        printf("10.下载群文件\n");
                        int choice1 = 0;
                        scanf("%d", &choice1);
                        while (getchar() != '\n')
                            ;
                        switch (choice1)
                        {
                        case 1:
                            msg.flag = 6;
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        case 2:
                            msg.flag = 300;
                            printf("请输入要发送的内容:\n");
                            scanf("%s", msg.content);
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        case 3:
                            msg.flag = 400;
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        case 4:
                            msg.flag = 410;
                            printf("请输入要禁言的群成员:\n");
                            scanf("%s", msg.toName);
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        case 5:
                            msg.flag = 420;
                            printf("选择你要邀请的好友\n");
                            scanf("%s", msg.toName);
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        case 6:
                            msg.flag = 430;
                            printf("请输入要踢出群聊的人:\n");
                            scanf("%s", msg.toName);
                            strcpy(msg.groupname, Group);
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        case 7:
                            msg.flag = 440;
                            printf("请输入你要上传的文件名\n");
                            scanf("%s", msg.filename);
                            printf("请输入你要上传的文件路径\n");
                            scanf("%s", msg.filepath);
                            FILE *file = fopen(msg.filepath, "r");
                            if (file == NULL)
                            {
                                printf("file %s open fail!\n", msg.filepath);
                                break;
                                ;
                            }
                            fseek(file, 0, SEEK_END);
                            msg.filesize = ftell(file);
                            fseek(file, 0, SEEK_SET);
                            memset(msg.file, 0, sizeof(msg.file));
                            fread(msg.file, msg.filesize, 1, file);
                            fclose(file);
                            strcpy(msg.groupname, Group);
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        case 8:
                            msg.flag = 450;
                            strcpy(msg.groupname, Group);
                            
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        case 9:
                            exitflag = 1;
                            break;
                        case 10:
                            msg.flag = 460;
                            printf("请输入要下载的群文件:\n");
                            scanf("%s", msg.filename);
                            strcpy(msg.groupname, Group);
                            
                            TcpClientSend(c,&msg, sizeof(msg));
                            break;
                        case 99:
                            msg.flag = 23;
                            TcpClientSend(c, &msg, sizeof(msg));
                            break;
                        default:
                            break;
                        }
                    }
                    break;
                case 301:

                    break;
                default:

                    break;
                }
            }
        }
    }

    ClearTcpClient(c);
    return 0;
}
